后端
文章平均质量分 66
CodeX0119
这个作者很懒,什么都没留下…
展开
-
进程切换和线程切换的区别
进程切换和线程切换的区别 我们都知道线程切换的开销比进程切换的开销小,那么小在什么地方?切换的过程是怎样的? 上下文切换 无论是在多核还是单核系统中,一个CPU看上去都像是在并发的执行多个进程,这是通过处理器在进程间切换来实现的。操作系统实现这种交错执行的机制称为上下文切换。 操作系统保持跟踪进程运行所需的所有状态信息,这种状态,也就是上下文,它包括许多信息,例如PC和寄存器文件的当前值,以及主存的内容。在任何一个时刻,单处理器系统都只能执行一个进程的代码。 当操作系统决定要把控制权从当前进程转移到某个新进转载 2021-12-15 15:20:25 · 1567 阅读 · 0 评论 -
tcp,udp特点
传输控制协议TCP TCP是面向连接的运输层协议。应用进程在使用TCP协议之前,必须先建立TCP连接 每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的。 TCP提供可靠交付的服务 TCP提供全双工通信。 TCP面向字节流 流:流入到进程或者从进程流出的字节序列。 面向字节流:虽然应用程序和TCP的交互是一次一个数据块,但TCP把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。 用户数据报协议UDP UDP是无连接的。简单方便,但不可靠。 UCP使用尽最大努力交付。类似于网络层。原创 2021-11-15 19:44:57 · 1019 阅读 · 0 评论 -
内存分配那些事儿
内存 程序的内存布局 现代的应用程序都运行在一个内存空间里,在32位系统里,这个内存空间拥有2的32次方(4GB)的寻址能力。这种内存模型又称为平坦的内存模型,整个内存是同一个统一的地址空间,用户可以使用一个32位的指针访问任意内存位置。如 int *p = (int*) 0x0018ff44 *p = 10; 这段代码展示了如何直接读写指定地址的内存数据。在4GB的内存空间中,一部分会挪给内核使用,应用程序无法直接访问这内存,这一部分叫做内核空间。windows系统一般会把高地址的2GB内存(或者配置为原创 2021-07-05 01:30:40 · 143 阅读 · 1 评论 -
IO复用epoll
epoll 函数 epoll_creat #include <sys/epoll.h> int epoll_create(int size); //size为epoll实例大小(仅供参考) 创建一个内核事件表,成功时返回epoll文件描述符,失败时返回-1。 需要终止时,需要调用close函数 epoll_ctl #include <sys/epoll.h> int epoll_stl(int epfd, int op, int fd, struct epoll_event原创 2021-04-02 16:12:00 · 63 阅读 · 0 评论 -
IO复用poll
poll 函数:在指定时间内轮询一定数量的文件描述符,测试是否有齐就绪者。 int poll(struct pollfd *fds, nfds_t nfds, int timeout); fds参数数组记录所有监听的文件描述符以及关注的事件 struct pollfd { int fd;//文件描述符 short events;//关注的事件类型 POLLIN | POLLRDHUP short revents;//指定文件描述符上实际发生的事情,由内核填充 } nfds原创 2021-04-02 16:11:18 · 88 阅读 · 0 评论 -
I/O复用select
I/O复用select 使用多进程服务器端,创建进程时需要付出极大的代价,需要大量的运算和内存空间,每个进程都是有独立的内存空间的,所以会愈加复杂,所以I/O复用可以改善这个问题。 I/O复用的使用情形 客户端程序要同时处理多个socket,如我们的非阻塞技术的实现 客户端程序要同时处理用户的输入和网络连接。 TCP服务器要同时处理监听socket和连接socket。 对应实现 步骤一: 设置文件描述符 指定监视范围 设置超时 步骤二: 调用select函数 步骤三原创 2021-04-02 16:10:36 · 60 阅读 · 0 评论 -
线程和进程
线程 为何要引入线程 多进程通讯的缺点有 创建进程的过程会带来一定的开销 为了完成进程间的数据交换,需要特殊的IPC技术 每秒少则数十次,多则数千次的 上下文切换 是创建进程时最大的开销。 上下文切换:运行程序前需要将相应的进程信息读入内存,如果运行进程A后需要紧接着运行进程B,就应该将进程A相关信息移出内存,并读入进程B相关信息。 而多线程是一种轻量级进程,它对比进程有如下的优点。 线程的创建和上下文切换比进程的创建和上下文切换更快。 线程间交换数据时无需特殊技术。 ...原创 2021-03-22 15:21:21 · 119 阅读 · 0 评论 -
僵尸进程
僵尸进程 概念 僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。如果父进程先退出 ,子进程被init接管,子进程退出后init会回收其占用的相关资源 危害 如果进程不调用wait / waitpid的话,那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵尸进程,将因为没有可用的进程号而导致系统不能产生新的进程. 此即为僵尸进程的危害,应当避免。 查看僵尸进程数目 top 命令行输入top命原创 2021-03-15 15:54:16 · 75 阅读 · 0 评论 -
进程间通讯--共享内存
共享内存 概念 共享内存就把一片逻辑内存共享出来,让不同的进程去访问它,修改它。 为什么共享内存是最快的进程间通讯方式 创建一块共享内存,将这块共享内存映射的自己的虚拟地址空间,接下操作都是直接对这块虚拟地址进行操作,进程间数据传递不再涉及到内核(进程不再通过执行进入内核的系统调用来传递彼此的数据),所以相较于其他的进程间通信少了两步内核态用户态之间的数据拷贝。 注意事项 共享内存并未提供同步机制。也就是说,在第一个进程结束对共享内存的写操作之前,并无自动机制可以阻止第二个进程开始对它进行读取。所以我们通常原创 2021-03-10 23:54:42 · 87 阅读 · 0 评论 -
聊天室项目
刚开始接触网络编程,学了一些内容之后,就像学着做一些项目,所以想实现一个简单的聊天室项目,完成服务器和客户端简单的交流,一开始知识有限,我就是用的socket连接客户端和服务器,然后使用send和recv函数实现了客户端和服务器简单的交流。 server.c #include <sys/types.h> #include <sys/socket.h> #include <string.h> #include <stdio.h> #include <net原创 2021-02-25 21:33:27 · 242 阅读 · 2 评论 -
进程间通讯--消息队列
消息队列 概念 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。 每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构。我们可以通过发送消息来避免命名管道的同步和阻塞问题。但是消息队列与命名管道一样,每个数据块都有一个最大长度的限制。 本质 是存储在内核中的一个消息的队列(链表) 特点 和管道一样,每个消息的最大长度是有上限的(MSGMAX),每个消息队列的总字节数也是有上限的(MSGMNB),系统上的消息队列总数也是有上限的(MSGMNI) ...原创 2021-02-25 10:38:33 · 187 阅读 · 0 评论 -
进程间通讯--管道
管道 管道是UNIX系统中最古老的IPC(进程间通信)方式,所有UNIX系统都提供这种通信机制。 管道就是从一个进程连接到另一个进程的一个数据流 管道分为命名管道和无名管道,在内核中申请一块固定大小的缓冲区,程序拥有写入和读取的权利,都可以看成一种特殊的文件,具有固定的读端和写端,也可以使用普通的read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中;无名管道一般使用fork函数实现父子进程的通信,命名管道用于没有血缘关系的进程也可以进程间通信;面向字节流、自带同步原创 2021-02-22 23:46:35 · 197 阅读 · 2 评论 -
fork函数
一个进程,包括代码,数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或传入的变量不同,两个进程也可以做不同的事。 在语句fpid = fork()之前,只有一个进程在执行这段代码,但在这条语句之后,就变成两个进程在执行了,这两个进程几乎完全相同。 fork之后做什么取决于数据流方向(管道永远流向读端(关闭 fd[1] 的那端)): 父进程关闭读端 fd[0] 子进程关闭写端 fd[1] 管道流向从父进程到子进程 父进程关原创 2021-02-22 23:01:43 · 141 阅读 · 0 评论