YouTube2Text

C Linux Semáforos System V 01 — Transcript

by juancarlosjromer · 5,748 words · 929 segments · language en · Watch on YouTube

Full transcript

  1. 0:00muy buenos días bueno hoy vamos a
  2. 0:02presentar el uso de semáforos existen 5
  3. 0:06en linux bueno comencemos
  4. 0:09antes de empezar a estudiar y ver y
  5. 0:13ejercitarnos con el tema de semáforos lo
  6. 0:15primero que deberíamos hacer es entender
  7. 0:18el problema de la sección crítica si el
  8. 0:21problema de la sección crítica aparece
  9. 0:24cuando queremos comunicar procesos y
  10. 0:27específicamente en los libros está
  11. 0:30explicado en función de un proceso de
  12. 0:33producción y un proceso de consumición
  13. 0:35entonces yo les pediría por favor que
  14. 0:38antes de seguir viendo este vídeo vayan
  15. 0:42a mi página a mi canal y vean el vídeo
  16. 0:46productor consumidor 01 cuyo link les
  17. 0:49dejo en esta en esa imagen
  18. 0:52bueno a esta altura ya habrán visto el
  19. 0:55vídeo producto al consumidor 01 en mi
  20. 0:58canal así que seguimos con semáforos
  21. 1:01vamos a usar las llamadas al sistema
  22. 1:04schengen sin control y sin off
  23. 1:08la llamada sistemas en get se usa para
  24. 1:10crear un conjunto de semáforos las
  25. 1:13llamadas se encontró y se usa para hacer
  26. 1:15operaciones de control sobre semáforo no
  27. 1:18son las únicas pero nosotros vamos a
  28. 1:19usar este se encontró para inicializar
  29. 1:23para ver el contenido del bar del
  30. 1:25semáforo y para borrar este semáforo y
  31. 1:29con la llamada se move vamos a
  32. 1:33para realizar las operaciones white y
  33. 1:36signal sobre semáforos
  34. 1:39bueno ustedes saben que tome la
  35. 1:43costumbre de dejarles la primera página
  36. 1:45del manual de las llamadas al sistema
  37. 1:47que usamos simplemente para no olvidarse
  38. 1:50que tienen que leer si tienen que leer
  39. 1:53más en detalle en este caso de la
  40. 1:56llamada sistema schengen de las llamadas
  41. 1:59sistemas en control y de la llamada el
  42. 2:01sistema se move sí así que bueno a leer
  43. 2:04bueno antes de empezar lo primero que
  44. 2:06vamos a hacer es darle una ojeada al
  45. 2:09comando ipcs de linux
  46. 2:12bien aquí estamos en la línea de
  47. 2:14comandos de la consola de linux así que
  48. 2:16vamos a ejecutar el comando y pss
  49. 2:20lo que ven en pantalla es la salida del
  50. 2:23comando y pss cuando se ejecuta que nos
  51. 2:26muestra los segmentos de memoria
  52. 2:27compartida la memoria compartida es un
  53. 2:30recurso de comunicación entre procesos
  54. 2:33después nos muestra el recurso matrices
  55. 2:37de semáforos o conjuntos de semáforos
  56. 2:40que es un recurso de sincronización
  57. 2:42entre procesos y después nos muestra el
  58. 2:46recurso con la de mensajes que es un
  59. 2:48recurso de comunicación y sincronización
  60. 2:51entre procesos así que bueno nosotros
  61. 2:55nos vamos a concentrar en este vídeo
  62. 2:58en el recurso semáforo o conjunto de
  63. 3:02semáforos y así que vamos a tipear vamos
  64. 3:06a borrar la pantalla y vamos a tipear
  65. 3:08nuevamente el comando pero con el
  66. 3:10argumento s entonces ahí nos muestra
  67. 3:14solamente el recurso semáforos
  68. 3:18no hay ningún semáforo creado todavía
  69. 3:20nosotros vamos a crear semáforos así que
  70. 3:23nos muestra solamente las columnas que
  71. 3:27nos dan información sobre cada conjunto
  72. 3:29de semáforos la primera columna es una
  73. 3:33clave que le da el programador al
  74. 3:35conjunto de semáforos creados la segunda
  75. 3:39columna es el identificador del conjunto
  76. 3:43de semáforos que se lo da el sistema
  77. 3:46operativo la tercera columna nos muestra
  78. 3:49cuál es el usuario el nombre de usuario
  79. 3:52que creó el recurso
  80. 3:55la cuarta columna nos muestra los
  81. 3:57permisos que tienen esos semáforos los
  82. 4:00permisos de acceso
  83. 4:03y la última columna nos muestra la
  84. 4:05cantidad de semáforos que se crearon
  85. 4:07para el conjunto para el conjunto sí así
  86. 4:12que bueno nosotros nos vamos a dedicar a
  87. 4:14hacer más foros en este vídeo
  88. 4:17bueno ahora vamos a dar una breve
  89. 4:18explicación de
  90. 4:20y la sintaxis
  91. 4:22el single de la llamada single
  92. 4:25bien el el senguer
  93. 4:30me va a devolver un entero que
  94. 4:33casualmente ese es el
  95. 4:36y si del recurso que va a crear el
  96. 4:41sistema así después va a recibir
  97. 4:44un tipo de dato kate que es un número
  98. 4:48extra decimal de ocho dígitos de
  99. 4:52hexadecimal es como máximo nosotros en
  100. 4:54el ejemplo le vamos a pasar el número
  101. 4:57ella decimal 0 x a sí
  102. 5:00va a recibir como argumento también el
  103. 5:02sen get un entero sí que va a definir la
  104. 5:08cantidad cantidad de semáforos
  105. 5:15del conjunto sí
  106. 5:18ese es el segundo argumento un entero
  107. 5:21nosotros en el ejemplo vamos a pasar dos
  108. 5:24entonces estos serían dos semáforos
  109. 5:26dentro del conjunto identificado por el
  110. 5:30sistema con el identificador del
  111. 5:33conjunto o sea eso lo vamos abordar a
  112. 5:36una variable entera se mide y el tercer
  113. 5:40argumento que le que tiene como entrada
  114. 5:43en schengen es un entero que va a ser
  115. 5:47una combinación de flux si nosotros
  116. 5:51vamos a usar tres flag el flag ipc
  117. 5:54create
  118. 5:56ips y
  119. 5:58el flag ipc exclusivo
  120. 6:03y el tercer flag serían los permisos y
  121. 6:09serían los permisos de acceso entonces
  122. 6:14repasando el send get nos devuelve un
  123. 6:16entero que es el identificador del
  124. 6:18conjunto de recursos semáforos recibe
  125. 6:21como argumentos de entrada
  126. 6:24una clave es un número extra decimal
  127. 6:27otorgada por el programador segundo
  128. 6:30argumento la cantidad de semáforos del
  129. 6:33conjunto puede ser uno puede ser dos por
  130. 6:35eso tres pueden ser m que van a
  131. 6:37pertenecer al conjunto se mide si
  132. 6:40nosotros vamos pasar dos vamos a usar
  133. 6:42dos semáforos y el tercer argumento son
  134. 6:45los flancos que nosotros vamos a ver el
  135. 6:47flag ips create ips exclusivo y los
  136. 6:49permisos y los permisos que le vamos a
  137. 6:52pasar van a ser 60 real los permisos son
  138. 6:57600 van a ver el código un 0 adelante
  139. 7:00para indicar que este número es ok tal
  140. 7:02si los permisos en realidad es este
  141. 7:05permiso de lectura y permiso de
  142. 7:07escritura para el creador del conjunto
  143. 7:10de semáforos igual ahora lo vamos a
  144. 7:13explicar este en el código mientras en
  145. 7:16lo que íbamos
  146. 7:18bueno vamos a crear un programa para
  147. 7:21crear semáforos
  148. 7:24el programita lo vamos a llamar creación
  149. 7:26ce ya tengo parte escrita para no
  150. 7:29hacerte largo el vídeo entonces tenemos
  151. 7:32acá la cabecera para abrir la cabecera
  152. 7:35para exit la cabecera para eventuales
  153. 7:39errores capturar eventuales errores de
  154. 7:43del cen get y acá tenemos las cabeceras
  155. 7:47que nos dice el manual que tenemos que
  156. 7:49incluir bueno vamos a hacer un
  157. 7:52programita en semi se mide es una
  158. 7:55variable no es una palabra reservada ahí
  159. 7:57vamos a capturar lo que nos devuelve el
  160. 7:59single el primer argumento de schengen
  161. 8:02es
  162. 8:04la clave que le va a otorgar el
  163. 8:07programador a ese conjunto de semáforos
  164. 8:09que no es lo mismo que el semen aire el
  165. 8:11aire es el identificador que usa el
  166. 8:14sistema operativo para identificar al
  167. 8:16conjunto de semáforos el segundo
  168. 8:19argumento es en get es la cantidad de
  169. 8:21semáforo del conjunto
  170. 8:23nosotros vamos a crear dos semáforos
  171. 8:24dentro ese conjunto y ahora vienen los
  172. 8:27flag
  173. 8:29este es el primer flag que indica que
  174. 8:31cree en los semáforos
  175. 8:33este es el segundo flag
  176. 8:38qué va a indicar o mejor dicho le va a
  177. 8:41decir a la creación de semáforos que si
  178. 8:44ya existe un conjunto de semáforos con
  179. 8:47esta clave de programador si este que es
  180. 8:52en get no toque el conjunto y que
  181. 8:54retorne un error si para no borrar los
  182. 8:58valores que ya tienen los semáforos
  183. 9:00podemos este obviar el ipc exclusivo y
  184. 9:04si mandamos a crear y el conjunto será
  185. 9:08que quizá existe lo va a pisar sí
  186. 9:12bueno y después vienen los permisos que
  187. 9:14forman parte de
  188. 9:18forman parte de los flag del tercer
  189. 9:20argumento este 0 indica que lo que viene
  190. 9:24a continuación es un número tal
  191. 9:26el número total es este es el número
  192. 9:29total indica que el creador o sea el
  193. 9:32usuario que va a ejecutar este código
  194. 9:35para crear el conjunto va a tener
  195. 9:39permiso de lectura y escritura sobre los
  196. 9:42semáforos del conjunto eso lo indica el
  197. 9:456 si estos dos indican ausencia de
  198. 9:50permisos para los usuarios del grupo del
  199. 9:54creador y los otros usuarios bueno la
  200. 9:57cuestión es que el creador el usuario
  201. 10:00que ejecuta este código va a tener
  202. 10:02permiso de acceso de lectura/escritura
  203. 10:04sobre los semáforos bien acá vamos a
  204. 10:07preguntar entonces qué sucedió con el
  205. 10:09sen get
  206. 10:11el sjr no es igual
  207. 10:16existe entonces quiere decir que el
  208. 10:23conjunto
  209. 10:26ya existe
  210. 10:32junto
  211. 10:35semáforos para la clave
  212. 10:420 x a
  213. 10:48sí no
  214. 10:50entonces vamos a ver que tiene se mida
  215. 10:54adentro
  216. 10:55entonces se mide es igual a
  217. 11:03ahí está entonces mostramos lo que tiene
  218. 11:06esa mira adentro que debería ser un
  219. 11:08valor distinto a menos 1
  220. 11:10bueno ahí tenemos el código vamos a
  221. 11:13guardar lo vamos a cerrar
  222. 11:16vamos a compilar lo
  223. 11:21le vamos a poner crea al ejecutable
  224. 11:24bueno
  225. 11:28bueno fíjense que no tenemos ningún
  226. 11:30conjunto de semáforos creados vamos a
  227. 11:32ejecutar crea
  228. 11:35y ahí nos dice que se mide el
  229. 11:37identificador del conjunto que nos
  230. 11:40devuelve el sistema operativo es ese
  231. 11:43bueno y ahí tenemos entonces
  232. 11:47en la columna de aquí tenemos la clave
  233. 11:50un número extra decimal como máximo de
  234. 11:53ocho dígitos esa es la clave que le puso
  235. 11:56el programador en el código esto es lo
  236. 11:58que nos retorna el sistema el
  237. 12:00identificador del conjunto de semáforos
  238. 12:04el usuario que ejecutó el proceso de
  239. 12:07creación que se convierte en el dueño
  240. 12:08del conjunto de semáforos los permisos
  241. 12:11para el dueño si herrera los permisos
  242. 12:13para el dueño son estos
  243. 12:16y entonces el dueño va a tener el
  244. 12:18permiso de lectura y escritura sobre los
  245. 12:21semáforos del conjunto y acabamos de
  246. 12:24crear dos semáforos y es importante
  247. 12:28saber que para identificar el semáforo
  248. 12:32del conjunto lo vamos identificar por
  249. 12:35ejemplo 0 y el este se mide entonces
  250. 12:40tenemos el semáforo 0 del conjunto 58 98
  251. 12:4340 y tenemos el semáforo 1 del conjunto
  252. 12:4858 98 40 si ahora después vamos a ver
  253. 12:52como dentro del código podemos usar uno
  254. 12:55u otro semáforo
  255. 12:57bien y si mandamos a ejecutar de nuevo
  256. 13:00la creación entonces fíjense que nos
  257. 13:04dice ya existe un conjunto de semáforos
  258. 13:06para la clave se requisa otra cosa que
  259. 13:09podemos ver es cómo borrar de la línea
  260. 13:11de comandos
  261. 13:13un recurso semáforos entonces podemos
  262. 13:16usar el comando ipc
  263. 13:19rm y entonces acá le vamos a poner que
  264. 13:24queremos borrar un conjunto de semáforos
  265. 13:27y le pasamos el 58 98 40 así entonces el
  266. 13:34comando para borrar el recurso semáforo
  267. 13:36sería ips rm ese es el argumento
  268. 13:39semáforo y el jemad y del conjunto que
  269. 13:43queremos borrar ahí está si ahora
  270. 13:47miramos no tenemos nada si bueno lo
  271. 13:51creamos de nuevo lo creamos de nuevo
  272. 13:53ahora nos dio otro
  273. 13:56vamos a
  274. 13:58a ver ahí vemos
  275. 14:02los datos del conjunto la clave el nuevo
  276. 14:05y de los demás propietarios permisos y
  277. 14:07números semáforos es es igual y si
  278. 14:11mandamos a crear de nuevo nos dice que
  279. 14:14ella existe un conjunto de semáforos
  280. 14:16para la clave pero quizá bueno nos
  281. 14:19quedamos con nos quedamos con este
  282. 14:21conjunto sí que es el que vamos a usar
  283. 14:24en nuestro ejemplo bien
  284. 14:28bueno antes de seguir adelante tenemos
  285. 14:31que hacer un poquito de teoría para
  286. 14:33entender mejor lo que se viene así que
  287. 14:36vamos a hacer un poquito
  288. 14:41bueno no nos tenemos que olvidar que
  289. 14:43estamos trabajando en un sistema
  290. 14:44operativo
  291. 14:46con multiprogramación mono procesamiento
  292. 14:48y mousse de usuario fuertemente acoplado
  293. 14:50así que en estos entornos y más
  294. 14:54específicamente donde hay
  295. 14:55multiprogramación tenemos acceso
  296. 14:57concurrente a datos compartidos de
  297. 15:00distintos procesos entonces esa
  298. 15:03concurrencia a datos compartidos puede
  299. 15:07provocar inconsistencia de datos y eso
  300. 15:10hay que tenerlo muy en cuenta entonces
  301. 15:12necesitamos
  302. 15:14mecanismos para asegurar la ejecución
  303. 15:17ordenada de procesos cooperativos si
  304. 15:20recuerden un poquito el vídeo cuando
  305. 15:23hicimos trabajamos con el abecedario con
  306. 15:24un proceso padre y un proceso hijo que
  307. 15:27hicimos una suerte de sincronización con
  308. 15:29el sleep cosa que no se debe hacer
  309. 15:32ahora vamos a usar el mecanismo que si
  310. 15:35se usa para sincronizar que son los
  311. 15:38semáforos entonces
  312. 15:41lo que presenta la bibliografía es
  313. 15:43buscar soluciones para el problema del
  314. 15:45producto al consumidor donde el
  315. 15:48productor consumidor son dos procesos
  316. 15:49que acceden en forma concurrente
  317. 15:53al mismo segmento de memoria compartida
  318. 15:56la condición de concurso existe cuando
  319. 16:00hay acceso concurrente desde distintos
  320. 16:02procesos a datos compartidos y entonces
  321. 16:06el resultado final de las
  322. 16:08actualizaciones de esos datos
  323. 16:09compartidos depende del orden de
  324. 16:11ejecución de los procesos
  325. 16:14la sección crítica es una instrucción o
  326. 16:18un conjunto de instrucciones dentro del
  327. 16:20proceso donde esas instrucciones acceden
  328. 16:24a datos compartidos oa memoria
  329. 16:26compartida así entonces si nosotros
  330. 16:29tenemos dentro de un proceso una
  331. 16:32instrucción que accede a un recurso
  332. 16:35compartido bueno esa instrucción es una
  333. 16:38sección crítica
  334. 16:39puede ser más de una instrucción por
  335. 16:41supuesto toda sección crítica debería
  336. 16:44tener una sección de entrada que es la
  337. 16:46parte del código que evalúa la
  338. 16:49posibilidad de entrar
  339. 16:52a ejecutar de seguir ejecutando las
  340. 16:54instrucciones que acceden a los datos
  341. 16:57compartidos y la sección crítica también
  342. 17:00debería tener una sección de salida que
  343. 17:02son las instrucciones que se ejecutan
  344. 17:06para indicar que el proceso salió de su
  345. 17:09sección crítica
  346. 17:11bueno aquí vemos una estructura
  347. 17:13[Música]
  348. 17:15lo que podría ser la parte de código de
  349. 17:17un proceso productor o consumidor
  350. 17:20que accede tanto a producir oa consumir
  351. 17:23a datos compartidos y esas instrucciones
  352. 17:26por supuesto están dentro de la sección
  353. 17:28crítica a la sección crítica
  354. 17:31se le antepone una sección de entrada y
  355. 17:35después de la sección crítica se pone
  356. 17:37una sección de salidas y
  357. 17:39la sección de entrada deba evaluar si
  358. 17:42puede entrar el proceso a su sección
  359. 17:43crítica y la sección de salida va a
  360. 17:46indicar que el proceso sale de su
  361. 17:49sección crítica
  362. 17:52bueno aquí reemplazamos la sección de
  363. 17:55entrada por la operación de adquirir un
  364. 17:58cerrojo un candado si reemplazamos la
  365. 18:02sección de salida por la liberación del
  366. 18:04cerrojo o candado
  367. 18:07al adquirir el cerrojo lo pueden pensar
  368. 18:10como que sí
  369. 18:12veo una habitación con la puerta abierta
  370. 18:14entro y cierro la puerta y ya nadie
  371. 18:17puede entrar
  372. 18:19y la sección de salida la puedo lo
  373. 18:21pueden pensar como que salgo de la
  374. 18:23habitación y dejó la puerta abierta para
  375. 18:24que otra persona puede entrar sí
  376. 18:27viene el semáforo el semáforo sería
  377. 18:30nuestro cerrojo o candado
  378. 18:33básicamente es un área de memoria donde
  379. 18:35se almacena o se guarda un valor entero
  380. 18:39y asociados al semáforo tenemos dos
  381. 18:43operaciones era adquirir que evalúa y
  382. 18:46modifica el valor del semáforo y
  383. 18:50release o la liberación del semáforo
  384. 18:54modifica también el valor del semáforo
  385. 18:56así
  386. 18:58la operación adquirir también recibe el
  387. 19:01nombre de white o simplemente operación
  388. 19:03p lo que hace es testear el valor del
  389. 19:07semáforo mientras el valor sea mayor o
  390. 19:09igual a 0 punto y coma no hace nada
  391. 19:11y eso el proceso va a quedar evaluando
  392. 19:14el valor hasta que el valor cambie
  393. 19:16cuando el valor cambia el semáforo
  394. 19:19cuando el valor del semáforo cambia y
  395. 19:20vale 1 entonces sale del ciclo de
  396. 19:22evaluación
  397. 19:24le resta un semáforo quiere decir que lo
  398. 19:27deja en 0 nuevamente
  399. 19:29el proceso pasa a la sección crítica
  400. 19:31esto quiere decir que si el proceso está
  401. 19:33en la sección crítica el semáforo
  402. 19:34debería avalar 0
  403. 19:36y cuando el proceso sale de la sección
  404. 19:39crítica hace la liberación del semáforo
  405. 19:43o también llamado signal o simplemente
  406. 19:46operación b le suma 1 al semáforo quiere
  407. 19:50decir que cuando el proceso salió la
  408. 19:52sección crítica el semáforo vale 1
  409. 19:54básicamente
  410. 19:57mientras el proceso está en la sección
  411. 19:59crítica el semáforo vale 0 y cuando sale
  412. 20:03de la sección crítica el semáforo vale 1
  413. 20:06esto es una versión muy resumida del
  414. 20:09funcionamiento interno del semáforo
  415. 20:13y hablando por supuesto de semáforos que
  416. 20:16toman el valor 0 y 1 nada más en cómo
  417. 20:20decíamos hay semáforos que pueden tomar
  418. 20:22los valores 0 y 1 nada más esos son los
  419. 20:24semáforos binarios también llamados mu
  420. 20:27text pero también existen los semáforos
  421. 20:29contadores o semáforos de cuenta que
  422. 20:32pueden tomar cualquier valor entero si
  423. 20:34nosotros en este vídeo vamos a trabajar
  424. 20:37con los semáforos binarios esto ha sido
  425. 20:40una breve explicación teórica así que
  426. 20:43por favor nos recomiendo la lectura de
  427. 20:45la bibliografía con respecto al tema de
  428. 20:49sincronización
  429. 20:50bueno ahora podemos seguir adelante con
  430. 20:53una explicación
  431. 20:55la llamada de sistemas en control
  432. 20:59el zen control
  433. 21:04bueno con el mst l lo que puedo hacer
  434. 21:07por ejemplo es inicializar en los
  435. 21:10semáforos si el cen ctl me devuelve un
  436. 21:14entero si menos 1 caso de error
  437. 21:20si el pse telecom se ejecuta me devuelve
  438. 21:23menos 1
  439. 21:24el 100 7 le fracaso por algún motivo
  440. 21:27cuáles son los argumentos del ctl bien
  441. 21:30un entero
  442. 21:33que es el c maybin
  443. 21:36o sea tengo que pasar el identificador
  444. 21:40del conjunto de semáforos el segundo
  445. 21:43argumento quién es lo que pasará al mst
  446. 21:46l es el número del semáforo un entero
  447. 21:50que es el número del semáforo
  448. 21:54y bueno en nuestro caso nosotros creamos
  449. 21:57dos semáforos así que yo debería pasar
  450. 21:5910 o 11 que no es el valor del semáforo
  451. 22:04es el número de semáforos y
  452. 22:08quiero inicializar el semáforo cero voy
  453. 22:11a pasarlo un 0 si quiero inicializar el
  454. 22:13semáforo 1 le voy a pasar un 1
  455. 22:16bien el tercer argumento es un entero
  456. 22:21que es el comando si el cmd que es lo
  457. 22:25que quiero hacer en este caso le voy a
  458. 22:26pasar el comando set vale si set vale es
  459. 22:33el comando que voy a usar para aceptar
  460. 22:35el valor del semáforo
  461. 22:37y el cuarto argumento es un entero que
  462. 22:42es el valor
  463. 22:45inicial del semáforo o el valor que le
  464. 22:47quiero dar al semáforo
  465. 22:50que tratándose de un semáforo binario
  466. 23:00debería inicializar lo en el valor cero
  467. 23:03o en el valor 1
  468. 23:06si lo inicial hizo en el valor cero
  469. 23:08entonces quiere decir que la puerta está
  470. 23:10cerrada si el proceso cuando evalúe con
  471. 23:16la sección de entrada el semáforo lo va
  472. 23:18a encontrar en cero y no va a poder
  473. 23:20entrar a la sección crítica
  474. 23:22y si lo inicial hizo con el valor 1 el
  475. 23:25proceso que haga una adquirir un white o
  476. 23:28un p sobre el semáforo en la sección de
  477. 23:30entrada el valor del semáforo es 1
  478. 23:33entonces lo va a poner el 0 a
  479. 23:36decrementar y va a entrar a la sección
  480. 23:38crítica así bien bueno entonces nosotros
  481. 23:41vamos a usar el set el en este caso para
  482. 23:43inicializar los semáforos
  483. 23:48bueno ahora vamos a ejemplificar en un
  484. 23:50código el uso del sen control o sea 7 l
  485. 23:55para inicializar los semáforos que hemos
  486. 23:58creado sí
  487. 24:00ya copia que aparte del código las
  488. 24:03cabeceras son las mismas
  489. 24:05un pequeño o una pequeña aclaración
  490. 24:07fíjense
  491. 24:17bien fíjense cómo usamos el zinc y ahora
  492. 24:21esa forma de schengen es para obtener el
  493. 24:25cem haití de un conjunto de semáforos ya
  494. 24:28creados
  495. 24:29entonces si anulamos el segundo y el
  496. 24:33tercer argumento y el primer argumento
  497. 24:36es la clave de un conjunto es la clave
  498. 24:39del programador de un conjunto de
  499. 24:41semáforos que ya existe entonces en get
  500. 24:43lo único que hace es obtener el cem
  501. 24:45haití de ese conjunto
  502. 24:50bien vamos a preguntar ahora si se me da
  503. 24:55es distinto de -1
  504. 24:59si se mide distinto de menos 1 entonces
  505. 25:01vamos a inicializar los dos semáforos
  506. 25:06entonces
  507. 25:0867 l él se mide si el identificador del
  508. 25:13conjunto de semáforos el número del
  509. 25:15semáforo
  510. 25:17el primer semáforo del conjunto
  511. 25:21el comando set vall para inicializar lo
  512. 25:24y el valor de inicialización el 1 lo
  513. 25:29vamos inicializar en 1 al semáforo 0 del
  514. 25:32conjunto se emite lo vamos a inicializar
  515. 25:34en 1
  516. 25:39al semáforo 1
  517. 25:42del conjunto se mide lo vamos a
  518. 25:45inicializar en cero
  519. 25:49vamos a poner else
  520. 25:52efe
  521. 26:11bueno ahí estamos entonces vamos a
  522. 26:15guardarlo
  523. 26:17vamos a compilar lo
  524. 26:34y ni le vamos a poner ejecutables
  525. 26:39bueno ahora lo vamos a ejecutar
  526. 26:43la inicialización y bueno me da error
  527. 26:47del sen get porque creo que nosotros
  528. 26:50habíamos borrado el conjunto así que
  529. 26:52vamos a ver si existe el conjunto
  530. 26:57no no existe el conjunto de semáforos
  531. 27:00por eso el sen get falla
  532. 27:02entonces me devuelve menos 1 bien
  533. 27:06entonces ahora vamos a crear acuérdense
  534. 27:08que nosotros teníamos el programita crea
  535. 27:10ahí está ahí creó el conjunto de
  536. 27:15semáforos con otros emad y por supuesto
  537. 27:18y ahora lo inicializa mos
  538. 27:21ahí está bueno tenemos que confiar qué
  539. 27:26proceso init inicial hizo los semáforos
  540. 27:29como nosotros queríamos que los
  541. 27:31inicializar independientemente de ello
  542. 27:34podremos hacer un programita
  543. 27:38para ver el contenido del semáforo voy a
  544. 27:41copiar in its en a ver sem
  545. 27:44punto c
  546. 27:46entonces voy a editar versión y lo voy a
  547. 27:49modificar
  548. 27:51verse
  549. 27:54bueno entonces ahora vamos a usar el sem
  550. 27:577 l
  551. 27:58para ver el contenido del semáforo
  552. 28:02entonces el comando para ver el
  553. 28:04contenido de un semáforo el get by
  554. 28:08sí ahí está entonces ahora lo que
  555. 28:11hacemos es recuperamos el pse mighty del
  556. 28:16conjunto cuya clave de programadores
  557. 28:18héroe quizá si no falla el send get
  558. 28:21entonces usamos mtl para ver el
  559. 28:25contenido del semáforo que queremos ver
  560. 28:27en este caso es del conjunto se mide el
  561. 28:32valor del semáforo 0 y del conjunto se
  562. 28:36mide el valor del semáforo 1 para ello
  563. 28:40lo que tenemos que hacer es meter el sem
  564. 28:43ctl dentro de un print
  565. 28:46efe para verlo
  566. 28:49brin efe
  567. 28:51bueno ya que podemos poner
  568. 28:5660
  569. 29:04y ahí vamos a ver el valor
  570. 29:08son los mismos
  571. 29:16vamos a ver ahora el valor del semáforo
  572. 29:191
  573. 29:22y acá le ponemos el paréntesis bueno ahí
  574. 29:26estaría entonces vamos a ver si funciona
  575. 29:29entonces mostramos con el print efe el
  576. 29:33valor que tiene el semáforo 0 y
  577. 29:35mostramos con el print efe el valor que
  578. 29:38tiene el semáforo 1 siempre hablando del
  579. 29:41conjunto de semáforos se mide
  580. 29:44guardamos vamos a compilar
  581. 29:48a este le vamos a poner ver
  582. 29:55acá vamos a poner ver
  583. 29:58vamos a poner
  584. 30:00bueno listo vamos a ejecutarlo
  585. 30:04y efectivamente vemos que el valor del
  586. 30:06semáforo 0 es la inicialización 1 y el
  587. 30:09valor del semáforo 1 es la
  588. 30:11inicialización 0 bien
  589. 30:14bien recién en la breve explicación
  590. 30:16teórica dijimos que había dos
  591. 30:18operaciones una operación era adquirir
  592. 30:23y la otra liberar o weight y la otra
  593. 30:26signal o pe y la otra operación be bueno
  594. 30:31hay que hacer un pequeño código para
  595. 30:32poder ejecutar esas operaciones así que
  596. 30:35lo que vamos a hacer ahora es escribir
  597. 30:37ese código
  598. 30:39bien vamos a escribir dos funciones
  599. 30:43a uno le voy a llamar p
  600. 30:52y le vamos a pasar a esa función dos
  601. 30:54enteros sí
  602. 30:55el primero entero es el identificador
  603. 30:58del conjunto de semáforos y el segundo
  604. 31:00entero es el número del semáforo si
  605. 31:03vamos a definir una estructura
  606. 31:07que llamasen buff
  607. 31:10y vamos a crear una instancia de esa
  608. 31:12estructura llamada buff
  609. 31:15y ahora vamos a cargar esa estructura
  610. 31:20la primera parte de la estructura el
  611. 31:22primer atributo la estructura es el
  612. 31:24número del semáforo que viene a la
  613. 31:25función que entra la función p en el
  614. 31:28segundo argumento ese es el número del
  615. 31:30semáforo
  616. 31:33y después vamos a cargar en el segundo
  617. 31:36atributo de la estructura
  618. 31:39la operación
  619. 31:41este número menos 1 define la operación
  620. 31:45p o define la operación white o define
  621. 31:49la operación adquirir si las tres las
  622. 31:53nombramos de la misma manera nombramos
  623. 31:55distintas pero significa la misma
  624. 31:56operación y el último atributo que vamos
  625. 32:03a inicializar son los flag bueno después
  626. 32:06podríamos hablar mucho de los flags por
  627. 32:09ahora vamos a hacer la operación más
  628. 32:10simple este estándar de la operación p
  629. 32:14o adquirir sí bueno pero eso no mandó a
  630. 32:18ejecutar el adquirir sino cuando
  631. 32:21ejecutar la operación pero que va mandó
  632. 32:22a ejecutar la operación p es el sem o la
  633. 32:25llamada al sistema se move sí que es la
  634. 32:28última en este vídeo que vamos a
  635. 32:31presentar entonces cuáles son los
  636. 32:33argumentos de se move
  637. 32:36bueno se mide sobre qué cuál es el array
  638. 32:41que contiene al semáforo sobre el cual
  639. 32:43se va a realizar la operación
  640. 32:46la operación que está definida en la
  641. 32:49estructura voz y cuántas operaciones son
  642. 32:53entonces se move cuando se ejecute ese
  643. 32:56move
  644. 32:58con esta configuración
  645. 33:01para este semáforo se va a ejecutar el
  646. 33:05adquirir entonces se va a ejecutar el
  647. 33:08adquirir aquí para que semáforo para
  648. 33:12este semáforo de que conjunto de este
  649. 33:16conjunto
  650. 33:18bien y de la misma forma que definimos
  651. 33:20la operación
  652. 33:24adquirir
  653. 33:26podemos definir la operación liberar o
  654. 33:30signal v
  655. 33:32si luego de cambiar ese es el nombre de
  656. 33:34la función y la operación ahora la
  657. 33:38operación es 1 básicamente lo que hace
  658. 33:44este lo que va a ser la ejecución de ese
  659. 33:47move eleva va a evaluar va a evaluar el
  660. 33:50semáforo para evaluar el semáforo y le
  661. 33:53va a restar 1 si el semáforo tiene un
  662. 33:57valor mayor a 0
  663. 34:01y esta operación directamente le va a
  664. 34:04sumar 1 entonces en la explicación en la
  665. 34:07breve explicación teórica de que dijimos
  666. 34:09que pedimos
  667. 34:11la operación p evaluaba el semáforo y si
  668. 34:15el semáforo tenía un valor mayor que 0
  669. 34:18entonces le restaba 1 y el proceso
  670. 34:21seguía la sección crítica y el semáforo
  671. 34:22quedaba en 0 y la operación b
  672. 34:26o liberar lo que así era sumarle uno sí
  673. 34:29bueno ya hemos definido
  674. 34:31en las dos operaciones la operación que
  675. 34:35se va a ejecutar acá y la operación se
  676. 34:38va a encontrar acá
  677. 34:40bueno no vamos a hacer mine a este punto
  678. 34:43se lo vamos a guardar así
  679. 34:46lo vamos a guardar así como vamos a
  680. 34:49compilar un
  681. 34:50punto sé que no tiene main vamos a
  682. 34:53compilar así cc
  683. 34:58p
  684. 35:01p
  685. 35:13bien
  686. 35:17del punto c
  687. 35:22bueno esto lo que obtiene es un programa
  688. 35:26de objeto
  689. 35:33ahí está
  690. 35:36si entonces yo escribo un punto ce en
  691. 35:39este caso por ejemplo que no tiene main
  692. 35:41no puede ser ejecutable pero sí puede
  693. 35:44ser un programa objeto la línea de
  694. 35:46compilación para crear un programa
  695. 35:47objeto es esta si bueno ese es nuestro
  696. 35:51primer paso bueno ahora tenemos que
  697. 35:54poner a prueba lo que hicimos si
  698. 35:57entonces la idea es hacer un pequeño
  699. 35:59ejercicio un ejercicio muy simple para
  700. 36:03lograr una ejecución ordenada entre un
  701. 36:07proceso y un proceso ve si suponemos que
  702. 36:12los dos procesos están en un ciclo
  703. 36:14infinito de producción con su misión del
  704. 36:16proceso a produce y el proceso que
  705. 36:18consume
  706. 36:20entonces el orden de ingreso a la
  707. 36:22sección crítica debería ser el siguiente
  708. 36:26primero pea produce bebe consume sea
  709. 36:31produce bebé consume sea produce tv
  710. 36:35consume y así se quedan infinitamente
  711. 36:38ese es el orden productor consumidor
  712. 36:41productor consumidor productor
  713. 36:43consumidor si en un ciclo infinito bueno
  714. 36:47para ello hemos creado dos semáforos el
  715. 36:50semáforo 0 y el semáforo 1 e inicial
  716. 36:55izamos el semáforo 0 en 1 y el semáforo
  717. 36:581 en 0
  718. 37:00entonces
  719. 37:02el proceso a
  720. 37:04en su ciclo infinito
  721. 37:07tiene una sección crítica que es la de
  722. 37:09producción del proceso ah pero debería
  723. 37:13tener una sección de entrada y una
  724. 37:15sección de salida
  725. 37:17y el proceso ve también en un ciclo
  726. 37:22infinito tiene su sección crítica con su
  727. 37:26misión del proceso ve y debería tener
  728. 37:28esa sección crítica una sección de
  729. 37:31entrada y una sección de salida
  730. 37:34cuál es la sección de entrada del
  731. 37:36proceso a es evaluar
  732. 37:40o sea la operación adquirir evaluar
  733. 37:45del conjunto se mide el semáforo 0
  734. 37:50cuál es la sección de entrada a la
  735. 37:54sección crítica del proceso de evaluar
  736. 37:57de la raíz de 1000
  737. 38:00el proceso el semáforo 1 pues la sección
  738. 38:05de salida del proceso a
  739. 38:08liberar
  740. 38:10de la rai o de conjunto se mide el
  741. 38:14semáforo 1 y cuál es la sección de
  742. 38:17salida del proceso b
  743. 38:21es liberar
  744. 38:23del arraigo del conjunto
  745. 38:27de semáforo se mide el semáforo 0
  746. 38:32bien qué pasa si yo mando ejecutar el
  747. 38:35proceso antes que mandar ejecutar el
  748. 38:38proceso a entonces el proceso ve antes
  749. 38:42de entrar a la sección crítica va a
  750. 38:44evaluar el semáforo 1 entonces va a
  751. 38:47decir el valor del semáforo 1 es menor o
  752. 38:50igual a 0 le va a decir que sí entonces
  753. 38:54se va a bloquear en esa en esa sección
  754. 38:58de entrada sí y ahí va a quedar hasta
  755. 39:01cuándo y hasta que el semáforo 1 no
  756. 39:05cambia su valor de 0 a 1 entonces yo voy
  757. 39:07a mandar a ejecutar el proceso a el
  758. 39:10proceso a entonces va a evaluar el
  759. 39:14semáforo 0 va a decir el valor del
  760. 39:16semáforo 0 es menor o igual a 0 le va a
  761. 39:20decir que no por qué porque lo
  762. 39:22inicializa mohsén 1 entonces qué va a
  763. 39:24ser le va a restar 1 al semáforo 0 le va
  764. 39:28a restar 1 lo va a dejar en 0
  765. 39:31y va a entrar la sección crítica cuando
  766. 39:34se haga la sección crítica que va a ser
  767. 39:36va a señalizar olivera del semáforo 1
  768. 39:39qué quiere decir eso que le va a sumar 1
  769. 39:42el semáforo 1 entonces el estado
  770. 39:46nuestros semáforos ahora es 0 para él se
  771. 39:48mostró 0 y 1 por el semáforo 1 qué
  772. 39:51quiere decir que cuando vuelva el
  773. 39:54proceso a evaluar el semáforo 0 lo va a
  774. 39:56encontrar el servicio al quedar
  775. 39:58bloqueado acá pero sin embargo el
  776. 40:01proceso a cambio el valor del semáforo 1
  777. 40:04entonces el proceso ve ahora va a
  778. 40:07encontrar un semáforo 1 en 1 que va a
  779. 40:10suceder y va puede pasar a la sección
  780. 40:13crítica porque su valor del semáforo es
  781. 40:161 pero antes de entrar va a dejar el
  782. 40:19semáforo 1 en 0 entra a la sección
  783. 40:22crítica
  784. 40:23cuando sale de la sección crítica
  785. 40:26calibrar el semáforo 0 entonces el
  786. 40:29semáforo 0 pasa valor 1 entonces en esto
  787. 40:34en este estado ahora el que puede entrar
  788. 40:36sección crítica es a y el que no puede
  789. 40:39entrar es bueno
  790. 40:42esto va a suceder infinitamente con esto
  791. 40:45con esta inicialización del semáforo 0
  792. 40:48en 1 y del semáforo no el 0 lo que vamos
  793. 40:51a lograr una sincronización de ejecución
  794. 40:55de ingreso a la sección crítica en el
  795. 40:58orden proceso a proceso de proceso a
  796. 41:01proceso de proceso a proceso de bueno
  797. 41:06van a quedar en el ciclo sí
  798. 41:09infinitamente bueno de ahora vamos a
  799. 41:13pasar esto a código sí
  800. 41:20bien ya tengo el proceso ha escrito para
  801. 41:23ahorrar tiempo porque se está haciendo
  802. 41:25muy largo el vídeo
  803. 41:27entonces acá tenemos el proceso
  804. 41:31el proceso a bueno todas las cabeceras
  805. 41:33que tiene que tener tiene los prototipos
  806. 41:37que están en el objeto p y ve acá están
  807. 41:44los prototipos de las funciones adquirir
  808. 41:46y liberar
  809. 41:48después tenemos acá el main del proceso
  810. 41:51a que necesita por supuesto saber el
  811. 41:55identificador del conjunto de semáforos
  812. 41:57y este es el ciclo infinito de
  813. 42:00producción simulando una producción no
  814. 42:02estamos produciendo nada en este vídeo
  815. 42:07simulando la producción en este ciclo
  816. 42:09infinito del proceso entonces simulamos
  817. 42:13acá la sección crítica y simulamos la
  818. 42:16sección crítica la sección crítica ahí
  819. 42:19debería haber un acceso a datos
  820. 42:21compartidos un acceso
  821. 42:23una memoria compartida pero simplemente
  822. 42:27para este vídeo tenemos el print y el
  823. 42:29slip el slip acá no cumple ninguna
  824. 42:31función de sincronización simplemente un
  825. 42:33retardo de ejecución en la producción
  826. 42:35nada más acá la sincronización está dada
  827. 42:38por los semáforos este 0 y por el
  828. 42:40semáforo 1 nada más
  829. 42:43la sección de entrada entonces es el
  830. 42:46adquirir el semáforo 0 y la sección de
  831. 42:49salida es liberar el semáforo 1 como
  832. 42:52explicamos este es el proceso el proceso
  833. 42:57y el proceso b
  834. 43:02a diferencia del proceso a simula ser el
  835. 43:06consumidor
  836. 43:08acá tienen los prototipos del
  837. 43:10adquirirlos el prototipo de liberar a
  838. 43:14semáforo por supuesto también tiene que
  839. 43:16conocer el y del conjunto de semáforos
  840. 43:19la sección crítica simulada de
  841. 43:23consumición no hay acceso en este caso a
  842. 43:25memoria compartida
  843. 43:29y el slip es para darle un retardo en la
  844. 43:31pantalla y ver el funcionamiento pero no
  845. 43:34tiene nada que ver con la sincronización
  846. 43:36repito la sincronización está dada por
  847. 43:38los semáforos pero yo no en este caso el
  848. 43:40proceso ve hace un alivio del semáforo 1
  849. 43:43y un liberar del semáforo 0 exactamente
  850. 43:46al revés que el proceso a sí bueno
  851. 43:56ahora les voy a mostrar un pequeño
  852. 43:59script
  853. 43:59que tenemos para poder compilar todo así
  854. 44:06me puse con pilar
  855. 44:10bien esta es la línea de comandos para
  856. 44:13obtener el programa objeto de pib punto
  857. 44:17c esta es la línea de comando para
  858. 44:20obtener el programa objeto de p a punto
  859. 44:24c y está la línea de comando para
  860. 44:26obtener el programa objeto de bebé
  861. 44:30ahí está
  862. 44:33eso es público pipas
  863. 44:36bien acá en la línea 5 tenemos la línea
  864. 44:41de comando para digamos obtener un
  865. 44:45ejecutable
  866. 44:47del objeto pib y el objeto vea o sea que
  867. 44:54los dos objetos me van a generar
  868. 44:57el ejecutable vea y esta es la línea
  869. 45:01para obtener el ejecutable pp también
  870. 45:05desde el objeto pib punto y el objeto pp
  871. 45:10punto entonces vamos a tener dos
  872. 45:12ejecutables con acceso a las funciones
  873. 45:16pib
  874. 45:18ahí está bueno vamos a
  875. 45:23ejecutar el compilar
  876. 45:29bien y ahí obtuvimos el ejecutable pea
  877. 45:34y el ejecutable pv lo único que tenemos
  878. 45:38que hacer ahora es probarlo
  879. 45:40y pp
  880. 45:42no son procesos emparentados a través de
  881. 45:45un fork así que son procesos
  882. 45:47independientes podemos ejecutarlo en dos
  883. 45:51terminales distintas entonces voy a
  884. 45:54abrir otra terminal
  885. 45:57esta va a ser una terminal
  886. 46:04y aquí vamos a tener otra terminal
  887. 46:24en una terminal vamos a ejecutar el
  888. 46:28proceso y en la otra vamos ejecutar el
  889. 46:31proceso
  890. 46:32vamos a ver la inicialización de los
  891. 46:35semáforos para recordar un poquito
  892. 46:37ahí está el semáforo 0 esta inicial
  893. 46:40izado en 1 la puerta para entrar la
  894. 46:42sección crítica está abierta para el
  895. 46:44proceso a y el semáforo 1 esta inicial
  896. 46:47izado en 0 la puerta está cerrada para
  897. 46:49entrar a la sección crítica en el
  898. 46:51proceso b o sea que lo único que puede
  899. 46:53entrar sección crítica es
  900. 46:56él ve no va a poder hasta que la
  901. 46:59habilite su semáforo así que bueno vamos
  902. 47:02a limpiar la pantalla y vamos a ejecutar
  903. 47:04de este lado el proceso a todavía no lo
  904. 47:08vamos a ejecutar vamos a mandar ejecutar
  905. 47:10primero el proceso ve para que se
  906. 47:13perciba el bloqueo si mandó ejecutar al
  907. 47:17proceso
  908. 47:17ven ahí está el proceso ve se quedó
  909. 47:21bloqueado en la sección de entrada p se
  910. 47:26me toma 1
  911. 47:28ahora cuando mande ejecutar el proceso y
  912. 47:33entonces va a empezar el ciclo de
  913. 47:35producción con su misión simulado
  914. 47:37ahí está proceso a proceso de a&b
  915. 47:42bueno así se realizan las
  916. 47:45sincronizaciones con semáforos y bueno
  917. 47:53y ahí los dejamos ejecutando
  918. 47:56infinitamente
  919. 47:58bueno espero que este vídeo les sirva
  920. 48:00les ayude a entender el uso y algunos
  921. 48:04conceptos básicos de semáforos aquí les
  922. 48:06dejo en esta imagen
  923. 48:09los dos vídeos que deberían ver ahora y
  924. 48:12que creo que pueden entender con mayor
  925. 48:16facilidad sincronización vaca y
  926. 48:18semáforos por si nombra 201 esos son los
  927. 48:22vídeos que deberían ver ahora bueno
  928. 48:24hasta el próximo vídeo
  929. 48:28[Música]

About this transcript

This page contains the full transcript of C Linux Semáforos System V 01 by juancarlosjromer, generated from the public captions YouTube serves with the video. The transcript has 5,748 words across 929 segments, with the original timestamps preserved so you can click any line to jump to that moment in the embedded player.

What you can do with it

Use the transcript to take notes, quote the speaker, build a study guide, generate a summary with ChatGPT or Claude via the YouTube Summary tool, or export it as a timed subtitle file with YouTube to SRT. You can also re-open it in the transcriber to translate the transcript into 100+ languages.

Free YouTube transcript tool

YouTube2Text is a free YouTube transcript generator — no signup, no daily limit. Paste any YouTube link and get the full transcript instantly, with timestamps, click-to-jump, translation to 100+ languages, AI prompts for ChatGPT, Claude, and Gemini, and exports to TXT, SRT, VTT, or Markdown.