在TCP/IP协议栈层面,在进行网络通信的两台主机之间建立逻辑通路是传输层的一个重要工作,这种逻辑通路的建立,一方面通过IP协议中的源IP和目的IP将两台主机联系起来,另一方面通过传输层协议中的源端口号和目的端口号将两台主机上唯一的进程联系起来。在IP协议的首部中会包含传输层的协议号,以区分使用的是哪一个传输层协议。站在传输层的角度,可以认为传输层制定了数据向对方主机发送的策略,例如TCP协议会有
网络概述随着计算机的普及,各个独立计算机之间进行通信的需求开始变得重要。计算机的工作本质是对数据进行处理并对结果进行输出,在实际工作中,很可能会遇到一台计算机输出的结果,需要作为另一台计算机的输入,并进行其他处理的情景,在计算机网络出现之前,这往往需要人在多台计算机之间来回走动仪完成工作,其效率可想而知。当最初的网络出现后,这种计算机之间的数据往来就可以通过某种网络媒介传送,速度快,距离远。随着历
线程概念操作系统中的线程线程(thread)是进程内部的一个执行序列。可以将线程理解为进程的进一步细分,一个进程至少有一个执行流,这也是之前所讨论的单线程进程。将进程进一步细分的原因有很多,一方面,每个线程都可以看作一个独立的执行流,并且这些执行流是共享进程中的相当一部分资源的,即一个进程中的所有线程都可以天然进行通信,这是单纯的多进程所不具备的;另一方面,线程更加轻量级,创建、回收和调度一个线程
信号概述信号是消息的载体,进程信号用于通知进程发生了某种情况。在现实生活中,我们是通过以下方式让认识信号的:第一,我们可以识别信号,知道信号的到来并对其进行区分;第二,我们知道信号的应对、处理方式;第三,我们在某些情况下可以记住信号。在计算机中,进程作为用户的代表,也应该具有与上述类似的特性和功能:进程必须能够识别、处理信号。即使没有收到信号,进程也应该知道各个信号的处理方法,处理信号的能力,属于
本文首先对System V信号量的原理进行讨论,由于System V信号量的接口过于复杂,并且被使用的较少,所以不再讨论相关接口,而是在线程部分对POSIX信号量的接口做详细介绍。然后对System V的相关内核数据结构进行展示,体现内核对System V通信的统一管理。System V 信号量原理锁在共享内存通信中,有时会出现这样的情况:写进程A还未完全写入数据,读进程B就提前读取数据,这时进程
本文对System V标准的共享内存和消息队列这两种进程间通信方式进行讨论,涉及原理、系统调用接口以及相关的内核数据结构。System V 共享内存基本原理进程间通信必须要让不同的进程看到同一份内存资源,因为进程具有独立性,所以这份内存资源是操作系统提供的,接口是由操作系统设计的。顾名思义,共享内存就是让不同的进程看到同一块内存空间,对这块内存空间的申请、释放、挂接和控制,都必须借助系统调用接口来
进程间通信概述在开发过程中,有时会需要进程间进行一些交流和互动,比如一个进程向另一个进程发送数据、发送命令、发送通知或进行某种协同,进程之间的这些行为,其实是在进行进程间通信。进程间通信,即是让多个进程之间可以实现数据层面的交互。由于进程的独立性,进程间通信的成本并不低。进程间通信,本质是让不同的进程的进程看到同一份“资源”,这份“资源”是系统中特定形式的内存空间,而且“资源”的提供者不能是任意一
Linux下的链接库包括静态链接库和动态链接库,本文首先从库的制作者角度讨论两种库的制作方法,再从库的使用者角度讨论两种库的使用方法。最后会重点讨论动态库的加载过程。为了更清晰地展现整个过程,本文的代码都以C/C++语言为例。静态库原理、制作和发布C/C++语言的编译包含三个阶段:预编译(.c/.cpp -> -i) 这个过程会对源代码做文本处理,进行宏替换和去掉注释。编译(.i -&
所有的计算机程序都需要存储和检索信息。长期存储信息有三个基本要求:能够存储大量信息。存储必须持久化。多个进程可以并发访问这些信息。这些任务一般由磁盘来进行。虽然固态硬盘在近年逐渐流行,但传统磁盘依然是存储大量数据的首选。本文只针对磁盘,不对固态硬盘进行讨论。使用磁盘来存储数据,必须要解决三个基本问题:检索问题(路径问题),即如何快速找到信息。权限问题,例如防止一个用户读取其他用户的信息。存储问题,
在Linux下,一切皆文件,而文件无非是被打开的文件与未被打开的文件。冯·诺依曼体系决定了,若要对磁盘上的文件进行读写,必须首先将其加载到内存中,所以被打开与未被打开文件之间最大的区别即为是否在内存中有一块属于自己的内存空间与相关的内存数据结构。在这篇文章中,我们讨论的即是被打开的文件,即是被加载到内存中的文件,即是文件的IO。本文会从之前讨论过的C语言的文件IO函数讲起,然后过渡到Linux有关
进程创建关于进程的创建,在Linux进程状态与进程优先级部分已进行过讨论,为了保证文章的完整性,这里再进行简述。在linux平台下,创建进程有两种方式:运行指令和使用系统调用接口,前者是在指令层面创建进程,后者是在代码层面创建进程。在C/C++代码中,使用 fork(2) 创建子进程,fork(2)的工作有3步:创建进程、填充进程内核数据结构和值返回,fork(2) 在值返回时分别在父、子进程中返
“地址空间”在之前讨论C++内存管理,以及平常写C/C++程序时,有如下的存储空间布局:虽然不是所有的实例都按照上图所示的分区排布,但这是一种最典型的做法,足以说明问题。这个示意图与在C++内存管理中所示的相似,但还是需要说明一下:(方便起见,暂时将这个空间称为程序的“地址空间”)在32位机器下,地址空间的范围是[0, 232),这是由地址总线排列组合的范围决定的。地址空间被大体划分为两个部分:内
Linux进程概念与管理方式Linux下的进程冯·诺依曼计算机体系结构决定了,一个程序只有被加载到内存中才能被 CPU 执行。粗浅来说,一个可执行程序被加载到内存中,即成为一个进程,但这种说法是不完全正确的。在 Linux 中,一个进程包括两部分:可执行程序的代码、数据和与这个可执行程序相对应的 PCB,即进程 = 代码和数据 + PCB。PCB(process ctronl block) 即进程
什么是makefilemakefile是一个文件。一个工程中的源文件数量不计其数,其按类型、功能、模块分放在不同的目录中,makefile制定了一系列规则指定哪些文件先编译,哪些文件后编译,哪些文件需要重新编译,以及更加复杂的功能操作。make是一个工具,用来解释makefile中的指令。make和makefile带来的好处就是自动化编译,在完成makefile的编写后,只需要一个make命令整个
本文以目标文件的结构为引子,通过探索在Linux环境下,一个具体的目标文件的结构来窥探ELF文件的结构。了解ELF文件的结构,对于加深对链接的理解、认识操作系统背后机理都有很大好处。编译和链接在正式讨论目标文件的结构之前,需要先对一个C/C++程序从源代码到可执行程序的构建过程有所了解。由于这部分不是本文重点,所以只做简要介绍。平常使用IDE进行程序设计时,这些工具往往会将编译和链接的过程一步完成
Linux用户分类root用户和普通用户作为一款多用户的操作系统,Linux可以分为两种用户:root用户和普通用户。root用户即超级用户,几乎可以在Linux系统下做任何事情,不受限制;普通用户往往受到权限限制,可以做有限的事。两种用户的区别也体现在命令行提示符上,root用户的命令行提示符是'#',普通用户的命令行提示符是'$'。用户切换使用 su [用户名] 并输入用户密码可以实现用户切换
作为vi的升级版,vim不仅能显示语法高亮,还能进行一些程序和脚本的编写。无论是在mac机器的终端上进行文件编写和管理,还是在linux机器上进行系统管理,vim都是一个必要的得力工具。阅读本文,读者可以查阅到一些最常用的vim命令,了解vim的缓存和恢复机制,以及实现对vim的脚本配置。vim简介在所有Linux发行版上面都会有一个文本编辑器,那就是vi。vim是vi的高级版,在vi的基础上加入
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号