linux基础05 | 线程
线程基本概念LWP:light weight process
轻量级的进程,本质仍是进程(linux环境下)
与win不同,区别挺大的,实现原理都不一样。
独立的进制空间,拥有PCB
线程:也有PCB,但没有独立的地址空间(共享)
区别:在于是否共享地址空间。
进程可以理解为独居
线程可以理解为合租
linux下的最小执行单位:线程
最小的资源分配单位:进程。
简单原理进程进行类似fork的操作,但是没有对父进程地址空间进行克隆clone,而是使用原有进程的三级页表,页表最终指向物理页面,中间有三次映射,也被称为三级映射
进程->虚拟地址(页目录->页表->物理页面)MMU->物理地址
不过线程不是完全使用进程的三级页表,实际上线程与进程的区别在于寄存器和栈的内容,不一样
函数指针调用分配在栈中(用户程序之间的栈)
两个指针(ebp,esp)组合规划(滑动窗口)一个栈帧,一个函数(还有局部变量等)占用的就是一个栈帧
进程在切换时要保存寄存器的值,这些值分配在内核区的栈空间之中
线程共享资源
文件文件描述符表
共享信号处理方式(信号建议不要与线程混用)
除了栈 ...
linux基础04 | 信号
信号信号的概念
摔杯为号
一只穿云箭,千军万马来相见
从这里可以看出信号几个特性,简单,迅速,明显,有条件触发的,多种的
信号是信息的载体,linux 古老的经典的通信方式,主要的通信手段
早期的信号不是很可靠,POSIX.1对可靠信号例程进行了标准化
信号基于linux内核进程间通信,内核发送内核处理
时钟中断基于硬件
信号早期相当于软中断
软中断与硬件中断相比实际上并不是很可靠
信号的4要素
信号名
信号编号
信号默认处理动作
term:终止进程
ign:忽略,子进程死亡,默认会向父进程发送这样的信号,让父进程保持运行,比如SIGHLD
Core:终止进程,GDB等调试的工具中比较常见
Stop:停止(暂停)进程
Cont:继续
信号对应事件
man 7 signal查看帮助文档
信号的产生5种方式注意:这里讨论的是ARM/X86的系统内核下的信号编号
按键产生
Ctrl+c 产生SIG INT(2)终止/中断(interrupt)
Ctrl+z 产生SIG T STP(20)终端暂停
Ctrl+\ 产生SIGQUIT(3)退出
系统调用
kill,raise,
...
linux基础02 | 程序和进程第一节
程序和进程程序是二进制文件,在磁盘上,不占用系统资源(CPU,内存,打开的文件,设备,锁….)
进程,比较抽象的概念,活跃的程序,占用系统资源
可以通俗理解为:程序是剧本,进程是上演的戏剧
需要知道的前置知识并发单道程序设计:DOS系统,程序只能排队占用CPU执行,
多道程序设计:想要实现多开进程,而CPU如果只有一个,需要划分时间分片设置一个时间中断,硬件手段,给打开的多个程序时间中断,给进程们进行分配CPU的使用时限,由于CPU计算相当快,人眼看不到停止轮次,就会认为是并行运行,实际上是并发
CPU和MMUCPU:硅,去沙滩抓把沙子做一做就弄明白了请移步机组文章
这里单独拿出MMU
MMU基本工作原理MMU是一个内存管理单元,在CPU中
虚拟内存只是个概念,需要MMU将虚拟内存的虚拟地址映射在对应的物理地址上。除了映射功能,还能设置内存访问的级别,一般英特尔cpu设定的内存访问级别都有四个级别
linux只使用了3级与0级两种级别
0级的内核空间,3级就是用户空间
在运行的两个进程,即使程序相同,但是用户区的映射的不是同一块的物理进程,内核区指向的物理内存实在同一块,但是PCB是不 ...
linux小作业 | 多进程拷贝
小作业01:多进程拷贝作业要求:实现多进程分段拷贝文件,可指定拷贝的文件的路径,和拷贝使用的进程数,
分析系统函数有:
fork
进程创建
waitpid
子进程死亡回收
stat
获取文件大小
open
打开文件
mmap
内存映射
难点分析也算不上什么难点,只不过需要对每个进程所需要的写入的片段字节大小和和偏移量思考一下,其余的无非就是细节上的问题。
代码1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495#include<stdio.h>#include<stdlib.h>#include<fcntl.h>#include<sys/types.h>#include<sys/wait.h>#in ...
Node项目需要注意的
Node项目需要注意的上传NPM的第三方的包过大时
将node_modules文件夹,添加到.gitgnore的忽略文件中
只需要创建一个package.json在项目文件夹下执行
1npm init -y
自动将依赖的第三方包记录在package.json中
注意:执行该命令时项目不能有中文和空格
下载git clone一个项目后,
需要执行该项目先前执行依赖包的下载操作
12npm i#npm install
卸载1npm uninstall 指定的包名
需要了解包的项目上线之后如果不会用到,将包安装时的指令添加选项-D
例如安装webpack
1npm i webpack -D
该包就会放入开发阶段的结点中
devDependencies(开发依赖包)
如果上线和开发都需要使用
默认的安装包的方式就好
默认的结点
Dependencies(核心依赖包)
第三方包的使用具体查看www.npmjs.com查阅文档
当然也可以直接去寻找REAMD.md文档
下包速度的提升更换镜像源
linux 下在家目录下的.npmrc文件添加这一行
1registry=https://regi ...
leetcode|水果成篮|简单C++实现
前言很久没做题了,久违的简单题,却没想到花了我一个小时我是一个一个一个究极菜狗啊啊,好久没做,思路都不清晰了,特记该文章边做题边理清思路
题目你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 。
你想要尽可能多地收集水果。然而,农场的主人设定了一些严格的规矩,你必须按照要求采摘水果:
你只有 两个 篮子,并且每个篮子只能装 单一类型 的水果。每个篮子能够装的水果总量没有限制。
你可以选择任意一棵树开始采摘,你必须从 每棵 树(包括开始采摘的树)上 恰好摘一个水果 。采摘的水果应当符合篮子中的水果类型。每采摘一次,你将会向右移动到下一棵树,并继续采摘。
一旦你走到某棵树前,但水果不符合篮子的水果类型,那么就必须停止采摘。
给你一个整数数组 fruits ,返回你可以收集的水果的 最大 数目。
来源:力扣(LeetCode)水果篮子示例 1:
123输入:fruits = [1,2,1]输出:3解释:可以采摘全部 3 棵树。
示例 2:
1234输入:fruits = [0,1,2,2]输出: ...
计算机网络基础|第六节|计网最高层
应用层同学们,达到计网最高层了嗷
应用层的两种方式P2P方式
对等方式,没有固定的服务请求者和服务提供者
服务分散型
可扩展性,系统新能不会因为规模的增大而降低
具有成本上的优势
c/s客户服务器方式
有明确的服务请求方,和服务提供方
服务器总是处于运行状态,等待客户的服务请求
服务集中型的
尝会出现服务器计算机跟不上众多客户机的请求情况
常用计算机群集,或者服务器场,构建一个强大的虚拟服务器
动态主机配置协议DHCPDHCP作为应用层协议,使用的是客户/服务器方式,使用UDP提供的服务
作用是:动态的分配网络配置,不需要手动操作配置主机
DHCP UDP 端口67
DHCP客户 UDP 端口68 UDP用户数据报
工作过程
主机,也就是DHCP客户,启动DHCP客户进程,广播发送一个DHCP DISCOVER(dhcp discover)报文DHCP发现报文,该报文主要包含
事务ID
MAC地址
原地址0.0.0.0
DHCP服务器收到该广播地址,根据其MAC地址,查找数据库找对应配置信息,没有就默认发送广播报文:DHCP OFFER(dhcp offer)DH ...
计算机网络基础|第五节|运输层
运输层物理层,数据链路层 ,网络层,实现了主机到主机的通信
但实际上,通信的真正实体其实是通信进程
P2P(端到端)运输层的协议
两种主要协议面向链接的TCP
无连接的UDP
AP(Applications Process)由于因特网上会出现不同的操作系统,不同格式的进程标识符,就需要统一的方法对TCP/IP体系的应用进程进行标识
端口(Port)实际上是区分应用进程的标识符(PID),并不是物理端口
端口号(PID)TCP/IP体系的运输层使用端口号来区分应用层不同的应用进程
16比特表示,取值为0~65535
熟知端口号:0~1023,IANA把这些端口号指派给TCP/IP体系中最重要的一些应用协议,例如:FTP使用21/20,HTTP适用80,DNS使用53.
登记端口号:1024~49151,为没有熟知的端口号使用,这类端口号必须在IANA按照规定的手续登记,以防止重复,例如:Microsft RDP微软远程桌面使用的端口3389。
短暂端口号:49152~65535,留给客户进程选择暂时使用。当服务器进程收到客户进程的报文是,就知道客户进程所使用的动态端口号。通信结束后, ...