11-进程-线程相关概念
进程概念
Process: 运行中的程序的一个副本,是被载入内存的一个指令集合,是资源分配的单位
进程ID(Process ID,PID)号码被用来标记各个进程
UID、GID、和SELinux语境决定对文件系统的存取和访问权限
通常从执行进程的用户来继承
存在生命周期
进程创建:
init:第一个进程,从 CentOS7 以后为systemd
进程:都由其父进程创建,fork(),父子关系,CoW:Copy On Write ,数据发生变化时创建子进程
进程
进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。进程是一种抽象的概念,从来没有统一的标准定义。
进程的组成进程一般由程序、数据集合和进程控制块三部分组成。
程序用于描述进程要完成的功能,是控制进程执行的指令集;
数据集合是程序在执行时所需要的数据和工作区;
程序控制块(Program Control Block,简称PCB),包含进程的描述信息和控制信息,是进程存在的唯一标志。
进程具有的特征:
动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的;
并发性:任何进程都可以同其他进程一起并发执行;
独立性:进程是系统进行资源分配和调度的一个独立单位;
结构性:进程由程序、数据和进程控制块三部分组成。
线程
在早期的操作系统中并没有线程的概念,进程是能拥有资源和独立运行的最小单位,也是程序执行的最小单位。任务调度采用的是时间片轮转的抢占式调度方式,而进程是任务调度的最小单位,每个进程有各自独立的一块内存,使得各个进程之间内存地址相互隔离。后来,随着计算机的发展,对CPU的要求越来越高,进程之间的切换开销较大,已经无法满足越来越复杂的程序的要求了。于是就发明了线程。线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间(也就是所在进程的内存空间)。一个标准的线程由线程ID、当前指令指针(PC)、寄存器和堆栈组成。而进程由内存空间(代码、数据、进程空间、打开的文件)和一个或多个线程组成。
进程和线程的区别
进程是操作系统分配资源的最小单位
线程是程序执行的CPU调度的最小单位
一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;
进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)及一些进程级的资源(如打开文件和信号),某进程内的线程在其它进程不可见;
调度和切换:线程上下文切换比进程上下文切换要快得多
mysql 单进程多线程,加锁解决资源争用
Redis server v=5.0.7 早期版本单线程
查看是线程否为多线程
root@ubuntu2004:~# ps -ef|grep redis redis 3769 1 0 00:19 ? 00:00:03 /usr/bin/redis-server 127.0.0.1:6379 top -Hp 3769
-H 显示线程信息 -p 指定pid
Threads: 4 total, 0 running, 4 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.0 us, 0.2 sy, 0.0 ni, 99.5 id, 0.2 wa, 0.0 hi, 0.2 si, 0.0 st MiB Mem : 3901.0 total, 3020.9 free, 299.8 used, 580.3 buff/cache MiB Swap: 3907.0 total, 3907.0 free, 0.0 used. 3362.8 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 3769 redis 20 0 50188 4796 3488 S 0.0 0.1 0:02.92 redis-server 3770 redis 20 0 50188 4796 3488 S 0.0 0.1 0:00.00 redis-server 3771 redis 20 0 50188 4796 3488 S 0.0 0.1 0:00.00 redis-server 3772 redis 20 0 50188 4796 3488 S 0.0 0.1 0:00.00 redis-server
[root@centos7 ~]# grep -i th /proc/484/status
Threads: 1
[root@centos7 ~]# pstree -p systemd(1)─┬─ ├─fdfs_storaged(930)─┬─{fdfs_storaged}(1340) #带{}的线程 ,公司员工,至少一个 │ ├─{fdfs_storaged}(1341) │ ├─{fdfs_storaged}(1342) │ ├─{fdfs_storaged}(1343) │ ├─{fdfs_storaged}(1344) │ ├─{fdfs_storaged}(1345) │ ├─{fdfs_storaged}(1346) │ └─{fdfs_storaged}(1347) ├─fdfs_trackerd(944)─┬─{fdfs_trackerd}(964) │ ├─{fdfs_trackerd}(965) │ ├─{fdfs_trackerd}(966) │ ├─{fdfs_trackerd}(967) │ ├─{fdfs_trackerd}(968) │ └─{fdfs_trackerd}(969) ├─nginx(945)─┬─nginx(947) │ └─nginx(948) ├─sshd(914)───sshd(1421)─┬─bash(1423) #进程和子进程 │ └─bash(1471)───pstree(1488)
├─redis-server(3769)─┬─{redis-server}(3770)
├─{redis-server}(3771)
└─{redis-server}(3772)
├─systemd-journal(484)
root@ubuntu2004:/proc/3769# grep -i Threads /proc/3769/status
Threads: 4 #redis 自己一个加剩余三个线程
找到资源占用高的进程的所在的磁盘文件,可以删掉临时解决,再分析系统为什么被黑掉
如果对文件设置 i 属性,那么不允许对文件进行删除、改名,也不能添加和修改数据;防止 病毒
root@ubuntu2004:/proc/3769# ll exe lrwxrwxrwx 1 redis redis 0 Apr 19 00:20 exe -> /usr/bin/redis-check-rdb*
chattr -i /usr/bin/redis-check-rdb
rm -f /usr/bin/redis-check-rdb
chattr -i /usr/bin/redis-check-rdb
并发 基于时间片10ms 处理,人感觉不到
并行 基于cpu核数同时处理
root@ubuntu2004:/proc/3769# ll /proc/`pidof tail`/fd lr-x------ 1 root root 64 Apr 19 01:25 3 -> /var/log/syslog