type
status
date
slug
summary
tags
category
icon
password
不抛弃,不放弃
📝 进程控制
进程特性: 1.动态性(进程动态产生,动态销毁) 2.并发性(可以同其他进程一起并发进行) 3.独立性(是一个能够独立运行的个体 同时也是系统分配资源和调度的独立单位) 4.异步性(进程间相互制约,因此进程们按照各自独立的,不可预知的速度向前推进)
进程 内存四区: 代码段(text)、数据段(data)-存放已经初始化的全局变量,静态变量、BSS段-保存未初始化的全局变量,静态变量、堆(Heap) 栈(Stack)
等待进程结束:
wait(int *status): 子进程存在, 父进程调用wait 后挂起,一直到某个子进程状态改变,存储状态放在 status中,用宏判断 status的方式可以查明进程结束的原因
如果子进程不存在,父进程调用wait 后立即返回,返回值为-1
1.进程通信
(1)信号(在Linux 中,信号是32位的整数)
信号由内核产生,3种方式触发 内核产生信号 1.用户操作 例如:Ctrl+C 2.进程执行出错,如:浮点数溢出 3.进程执行某个系统调用或函数 如:调用kill 向某个进程发送信号,或者raise ,alarm系统调用
(2)管道
半双工通信, 实现两个方向的数据流,通信时只有一个方向的数据流。管道文件,内容在内核中,在文件系统中没有名字(inode)
pipe:
FIFO:
有名管道,文件名随文件系统持续性,关机后存在,fifo文件内容存在内核,随着内核持续性
IPC资源 - 只在本机使用,不能跨网络。生存周期与内核相同
System V 信号量 、共享内存、消息队列
📝 线程
线程优势:线程不占用或者占用很少的资源,多线程间共享地址空间 线程间切换效率高 提高程序响应速度
pthread_creat(pthread_t *thread,const pthread_attr_t *attr,void*(*stat_routine)(void*),void *arg)
thread: 线程创建成功时,返回新线程ID
attr: 线程属性,NULL表示默认属性
start_rountine: 线程创建后调用的函数,也称为线程函数
arg: 传递给线程函数的参数
pthrad_exit() :线程退出函数 pthread_jion() :线程等待结束函数
1.线程通信
(1)互斥锁(pthread_mutex_t),在临界资源 访问前上锁,访问完解锁
(2)条件变量(pthread_cond_t) pthread_cond_signal() pthread_cond_wait() 先后顺序
(3)信号量,P 操作 V操作
(4)读写锁
读写锁与互斥量类似,不过读写锁允许更改的并行性,也叫共享互斥锁。互斥量要么是锁住状态,要么就是不加锁状态,而且一次只有一个线程可以对其加锁。读写锁可以有3种状态:读模式下加锁状态、写模式加锁状态、不加锁状态。
一次只有一个线程可以占有写模式的读写锁,但是多个线程可以同时占有读模式的读写锁(允许多个线程读但只允许一个线程写)。
【读写锁的特点】:
如果有其它线程读数据,则允许其它线程执行读操作,但不允许写操作;
如果有其它线程写数据,则其它线程都不允许读、写操作。
【读写锁的规则】:
如果某线程申请了读锁,其它线程可以再申请读锁,但不能申请写锁;
如果某线程申请了写锁,其它线程不能申请读锁,也不能申请写锁。
2.线程和进程的差别
本质差别 : 进程是系统资源分配的基本单位, 线程是系统任务调度的基本单位
并发性: 进程采用隔离并行的运行机制, 若是同一线程的不同线程并行,则相互影响,需要加锁来保证临界资源的安全性
内存的区别: 进程有着自己独立的虚拟内存空间,线程没有
切换损耗: 进程切换需要耗费大量资源,切换上下文 线程不用
📝 网络编程
原理:一个进程利用socket 接口数据写到内核,另一个利用接口数据读取到自己的进程空间。套接字本身就是一个文件描述符
安装了”TCP/IP协议栈”的主机有IP地址,进行通信
TCP和UDP 的区别
(1)TCP面向连接的可靠传输,UDP不面向连接的不可靠传输
TCP通过三次握手建立连接,四次握手断开连接
(2)TCP 和 UDP 传输的数据格式不一样 TCP 传输字节流, UDP传输报文
字节流分段,带有序号标识 报文不需要分段 TCP准确性比UDP高
(3)TCP 的传输效率比 UDP差
🤗 总结归纳
总结文章的内容
📎 参考文章
- 一些引用
- 引用文章
有关Notion安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~