Linux 系统编程|进程间通信
Linux 系统编程第七章 进程间通信(IPC)7.1 进程间通信概述一、进程间通信的目的
数据传输:一个进程将它的数据发送给另一个进程。
共享数据:多个进程操作共享的数据,这些操作对每个进程都是实时的。
通知事件:一个进程需要向另一个或一组进程发送消息,通知某种事件的发生。
资源共享:多个进程在内核的锁与同步机制的基础上共享同样的资源。
进程控制:有些进程希望完全控制另一个进程的运行(如 debug 调试),并能够及时知道其状态的改变。
二、进程间通信的变革
Linux 进程间通信由几个部分发展而来
早期 UNIX 进程间通信
基于 System V 的进程间通信
基于 Socket 的进程间通信和 POSIX 进程间通信
UNIX 进程间通信方式包括:管道、FIFO、信号
System V 进程间通信方式包括:System V 消息队列、System V 信号灯、System V 共享内存
POSIX 进程间通信方式包括:POSIX 消息队列、POSIX 信号灯、POSIX 共享内存
现代的进程间通信方式包括:管道和命名管道、信号、消息队列、共享内存、进程信号量、套接字
7 ...
Linux 系统编程|线程
Linux 系统编程第六章 线程6.1 线程的基本概念一、定义
进程是资源管理的最小单位,线程是程序执行的最小单位。
每个进程拥有自己的数据段、代码段和堆栈段。线程是轻型的进程,它包含独立的栈和 CPU 寄存器状态。线程是进程的一条执行路径,每个线程共享其所附属的进程的所有资源,包括打开的文件、内存、信号标识和动态分配的内存等。
线程比进程小得多,花费更少的 CPU 资源。
在操作系统设计上,从进程演化出线程,最主要的目的就是更好地支持多处理器,并且减小进程上下文切换的开销。
默认情况下,一个进程中只有一个线程(主控线程/主线程)。通过主控线程,可以创建出其他若干子线程。主控线程和子线程都隶属于当前的进程。当系统给一个进程分配一定的时间片,这些时间会分配给其中的线程,但是在同一时间,只能有一个线程在执行,具体的执行根据系统的调度,将对应线程从就绪状态变为运行状态。
即,系统先调度哪一个进程执行,再调度进程中哪一个线程执行。
进程和线程的关系
线程属于进程。线程运行在进程空间内。统一进程所产生的线程共享同一用户内存空间,当进程退出时该进程所产生的所有线程都会被强制退出。一个进程至少需 ...
Linux 系统编程|进程与信号
Linux 系统编程第五章 进程5.1 进程的基本概念一、程序与进程
程序是存放在磁盘文件中的可执行文件,本质上是代码集合。
程序的执行实例被称为进程
进程有独立的权限与职责,如果系统中的某个进程崩溃,不会影响到其余的进程。
每个进程运行在各自的虚拟地址空间中,进程之间可以通过由内核控制的机制相互通讯
每个 Linux 进程都有一个唯一的数字标识符(非负整数),称为进程 ID(process ID)。
查看进程 ID
1ps -ef | more
二、进程在内核中的结构进程表项 / 进程控制块task_struct
三、进程的启动与终止启动例程
在进程的main函数执行之前内核会启动特殊的启动例程
编译器在编译时会将启动例程编译进可执行文件
启动例程的作用
搜集命令行参数传递给main函数的argc和argv
搜集环境信息构建环境表并传递给main函数
登记进程的终止函数
进程终止
正常终止
从main函数返回
调用exit函数(标准 C 库<stdlib.h>)
调用_exit或_Exit函数(系统调用)
最后一个线程从其启动例程返回
最后一 ...
Linux 系统编程|文件
Linux 系统编程第三章 文件I/O3.1 标准 C 的I/O12345char *fgets(char *s, size_t size, FILE *stream);int printf(const char *format, ...);int fprintf(FILE *stream, const char *format, ...);size_t fread(void *ptr, size_t size, size_t count, FILE *stream);// ...
FILE类型是一个结构体
12345678typedef struct iobuf { int cnt; // 剩余字节数 char *ptr; // 下一个字符的位置 char *base; // 缓冲区的位置 int flag; // 文件访问模式 int fd; // 文件描述符 // ...} FILE;
stdin stdout stderr 也是三个文件指针(流指针),在scanf printf等内部会被调用。
标准 ...
Linux 系统编程|补充与进阶
Linux 系统编程第二章 补充与进阶2.1 Linux 常用命令补充:根目录结构
目录名称
内容
/bin
用户可执行文件,如ps ls ping等
/sbin
系统管理所用的可执行文件
/etc
所有程序需要的配置文件
/dev
设备文件
/proc
虚拟的文件系统,包含系统进程的相关信息
/var
变量文件,如系统日志、数据库文件等
/tmp
系统和用户创建的临时文件
/usr
用户程序
/home
用户个人文档
/boot
引导加载程序的相关文件
/lib
系统库
/opt
可选的附加应用程序
/mnt
临时安装目录,用于挂载文件系统
/media
可移动媒体设备目录,用于挂载 CD-ROM 等设备的临时目录
/srv
服务器特定服务的数据
一、文件系统相关命令列出内容123ls # 列出当前目录的内容 ls -a /etc # 列出 /etc 所有内容(包括隐藏文件)ls -l ~ # 列出 ~ 内容的详细信息
查看当前目录1pwd
创建目录12mkdir bin ...
Linux 系统编程|概述
Linux 系统编程第一章 操作系统概述1.1 计算机的基本组成1.2 操作系统及其发展1.3 Linux 操作系统一、组成1. 内核
操作系统的核心,负责管理系统的进程、内存、设备驱动程序、文件和网络系统
控制系统和硬件之间的相互通信
决定着系统的性能和稳定性
2. shell3. 文件系统4. 应用程序二、基本概念1. 文件和文件系统文件:数据或设备的一种逻辑组织
文件系统:文件间关系管理的一种逻辑组织
2. 程序和进程程序:计算机执行的指令集合
进程:程序的一个运行实例,操作系统资源分配的最小单位
3. 线程(轻量级进程)线程是程序运行的基本单位,一个进程内部可以有一或若干线程同时运行
4. 信号Linux 系统中进程通信的一种技术,异步程序设计的基础
5. 客户端和服务器三、Linux 启动流程
芯片和部分周围电路初始化
加载内核
加载最小文件系统
加载硬盘上的根文件系统
启动 1 号进程/sbin/init
四、Linux 内存管理1. 内存模型
2. 内存管理特点
进程隔离
保护独立的 ...
BUAA Software CO|计算机组成原理概要1
BUAA Software CO|计算机组成原理概要101 绪论冯诺依曼架构
计算机应由运算器、控制器、存储器、输入设备和输出设备五个基本部件组成。
各基本部件的功能
存储器不仅能存放数据,而且也能存放指令,形式上两者没有区别,但计算机应能区分数据还是指令。
控制器应能自动取出指令来执行。
运算器应能进行加/减/乘/除四种基本算术运算,并且也能进行一些逻辑运算和附加运算。
操作人员可以通过输入设备、输出设备和主机进行通信。
内部以二进制表示指令和数据。每条指令由操作码和地址码两部分组成。操作码指出操作类型,地址码指出操作数的地址。由一串指令组成程序。
采用“存储程序”工作方式:任何要计算机完成的工作都要先被编写成程序,然后将程序和原始数据送入主存并启动执行。一旦程序被启动,计算机应能在不需操作人员干预下,自动完成逐条取出指令和执行指令的任务。
程序编译与加载
两类指令集
计算机层级结构
ISA 是软件和硬件的界面(Interface,接口),也是计算机组成(organization)的抽象 / 接口,或者说一种计算机组成是某种 ISA 的实现。
应用程序二进制接口(Applic ...
离散数学|集合论
离散数学|集合论第五章 集合
第六章 关系
第七章 函数
面向对象的程序设计
面向对象的程序设计一、Java 语言1. Java 的特点
面向对象
两个基本概念:类、对象
三大特性:封装、继承、多态
健壮性
吸收了 C/C++ 语言的优点,但是去掉了指针、内存的申请和释放等影响程序健壮性的部分,提供了一个相对安全的的内存管理和访问机制。
跨平台性
Write once, run anywhere. 由 JVM 来负责 Java 程序在不同系统上的运行。
2. Java 虚拟机
JVM 是一个虚拟的计算机,具有指令集并使用不同的存储区域,负责执行指令,管理数据、内存、寄存器。
不同平台对应的 JVM 也不同。只要某平台提供了对应的 Java 虚拟机,Java 程序就可以在此平台运行。
Java 虚拟机机制屏蔽了底层运行平台的差异。
3. 垃圾回收机制
Java 提供了一种系统级线程跟踪存储空间分配情况的手段,在 JVM 空闲时,检查并释放那些可被释放的内存空间。
垃圾回收在 Java 程序运行过程中自动进行,程序员无法精确控制和干预。
即便如此,Java 程序仍可能会出现内存泄漏和溢出的问题。
4. JRE 和 JDK
Java Runtime E ...